﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace GeracaoArquivoCorretora
{
    public partial class GeraArquivo : Form
    {
        public string usuario;
        public string senha;
        public bool criptografada;
        public string nome_usuario;
        int contador = 0;
        public string database = string.Empty;
        delegate void EnviaMensagemProcessamentoCallBack();
        public int id_cliente = 0;
        public string caminho_arquivo = string.Empty;
        public string header_linha = string.Empty;
        public string trailer_linha = string.Empty;
        public string cd_corret = string.Empty;
        public GeraArquivo()
        {
            InitializeComponent();
        }

        private void GeraArquivo_Load(object sender, EventArgs e)
        {
            Login login = new Login();
            login.ShowDialog(this);

            DataTable dtEmpresa = login.dtEmpresas;

            SelecionaEmpresa sel = new SelecionaEmpresa(dtEmpresa, login.Criptografada);
            sel.ShowDialog(this);

            string connection_string = "Data Source=" + login.database + ";User Id=" + usuario + ";Password=" + senha + ";";

            string sql_header = @"select 
'00' ||
'CCMA' ||
lpad(CD_CORRET,4,'0') ||
lpad(CD_CORRET,4,'0') ||
'CBLC    ' ||
'000000001' ||
to_char(sysdate, 'yyyymmdd') ||
to_char(sysdate, 'yyyymmdd') ||
lpad(' ',653,' '), cd_corret

FROM TSCPARM";


            string sql_trailer = @"select 
'99' ||
'CCMA' ||
lpad(CD_CORRET,4,'0') ||
lpad(CD_CORRET,4,'0') ||
'CBLC    ' ||
'000000001' ||
to_char(sysdate, 'yyyymmdd') ||
'999999999' ||
to_char(sysdate, 'yyyymmdd') ||
lpad(' ',644,' ')

FROM TSCPARM";

            

            string select_count = string.Format(@"select 
COUNT(1)
FROM tscclibol a
,tscparm b
where a.CD_CLIENTE_LIQFIN = {0} and in_gera_exp = 'S' and a.CD_CLIENTE_LIQFIN != a.CD_CLIENTE", id_cliente);


            System.Data.OracleClient.OracleDataAdapter adapter_header = new System.Data.OracleClient.OracleDataAdapter(sql_header, connection_string);
            DataTable header = new DataTable();
            adapter_header.Fill(header);
            header_linha = header.Rows[0][0].ToString();
            cd_corret = header.Rows[0][1].ToString();
            adapter_header.Dispose();

            System.Data.OracleClient.OracleDataAdapter adapter_trailer = new System.Data.OracleClient.OracleDataAdapter(sql_trailer, connection_string);
            DataTable trailer = new DataTable();
            adapter_trailer.Fill(trailer);
            trailer_linha = trailer.Rows[0][0].ToString();
            adapter_trailer.Dispose();




            System.Data.OracleClient.OracleDataAdapter adapter_count = new System.Data.OracleClient.OracleDataAdapter(select_count, connection_string);

            DataTable count = new DataTable();
            adapter_count.Fill(count);

            contador = Convert.ToInt32(count.Rows[0][0].ToString());
            pbProcessamento.Maximum = contador;

            lblProcessando.Text = "Iniciando Processamento de " + contador + " registros";

            database = login.database;

            

            IniciaProcessamento();

        }

        private void IniciaProcessamento()
        {


           System.Threading.Thread piThread = new System.Threading.Thread(new System.Threading.ThreadStart(GeraArquivoCorretora));
            piThread.Start();

        }

        private void GeraArquivoCorretora()
        {
            string select = string.Format( @"select 
'02' ||
'V' ||
lpad(b.CD_CORRET,5,'0') ||
lpad(a.CD_CLIENTE_LIQFIN,7,'0') ||
lpad(a.CD_CLIENTE,7,'0') ||
b.DV_CORRET ||
a.DV_CLIENTE_LIQFIN ||
a.DV_CLIENTE ||
lpad(' ',675,' ')
FROM tscclibol a
,tscparm b
where a.CD_CLIENTE_LIQFIN = {0} and in_gera_exp = 'S' and a.CD_CLIENTE_LIQFIN != a.CD_CLIENTE", id_cliente);
            ;

            string connection_string = "Data Source=" + database + ";User Id=" + usuario + ";Password=" + senha + ";";

            System.Data.OracleClient.OracleDataAdapter adapter = new System.Data.OracleClient.OracleDataAdapter(select,connection_string);

            DataTable dtTemp = new DataTable();
            adapter.Fill(dtTemp);


            StringBuilder sb = new StringBuilder();

            //header
            sb.AppendLine(header_linha);

            foreach(DataRow dr in dtTemp.Rows)
            {
                //processamento
                EnviaMensagemProcessamento();
                sb.AppendLine(dr[0].ToString());

            }

            //footer
            sb.AppendLine(trailer_linha.Replace("999999999",string.Format("{0:000000000}",dtTemp.Rows.Count+2)));

            EnviaMensagemGravacaoArquivo();
            System.IO.File.WriteAllText(caminho_arquivo + "\\CCMA" + string.Format("{0:0000}", Convert.ToInt32(cd_corret)) + ".txt", sb.ToString());


            MessageBox.Show("Arquivo gerado com sucesso");
        }

        private void EnviaMensagemGravacaoArquivo()
        {
            if(pbProcessamento.InvokeRequired || lblProcessando.InvokeRequired)
            {
                EnviaMensagemProcessamentoCallBack callBack = new EnviaMensagemProcessamentoCallBack(EnviaMensagemGravacaoArquivo);
                this.Invoke(callBack);
            }
            else
            {
                pbProcessamento.Value = pbProcessamento.Maximum;
                lblProcessando.Text = "Gerando arquivo no diretorio selecionado";

            }
        }

        private void EnviaMensagemProcessamento()
        {
            if(pbProcessamento.InvokeRequired || lblProcessando.InvokeRequired)
            {
                EnviaMensagemProcessamentoCallBack callBack = new EnviaMensagemProcessamentoCallBack(EnviaMensagemProcessamento);
                this.Invoke(callBack);
            }
            else
            {
                pbProcessamento.Value++;

                if(pbProcessamento.Value % 50 == 0)
                {
                    lblProcessando.Text = "Processando registro " + pbProcessamento.Value + " de " + pbProcessamento.Maximum;
                }

            }
        }
    }
}
